package com.example.stuwork.service.impl;

import com.example.stuwork.dao.ClassCourseDao;
import com.example.stuwork.dao.ClassDao;
import com.example.stuwork.dao.CourseDao;
import com.example.stuwork.dao.TeacherDao;
import com.example.stuwork.pojo.ClassCourse;
import com.example.stuwork.service.ClassCourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 班级课程关联服务实现类
 */
@Service
public class ClassCourseServiceImpl implements ClassCourseService {
    
    @Autowired
    private ClassCourseDao classCourseDao;
    
    @Autowired
    private CourseDao courseDao;
    
    @Autowired
    private ClassDao classDao;
    
    @Autowired
    private TeacherDao teacherDao;
    
    @Override
    public List<ClassCourse> findByCourseId(String courseId) {
        if (StringUtils.isEmpty(courseId)) {
            return new ArrayList<>();
        }
        return classCourseDao.findByCourseId(courseId);
    }
    
    @Override
    public List<ClassCourse> findByClassId(Long classId) {
        if (classId == null) {
            return new ArrayList<>();
        }
        return classCourseDao.findByClassId(classId);
    }
    
    @Override
    public ClassCourse findByCourseIdAndClassId(String courseId, Long classId) {
        if (StringUtils.isEmpty(courseId) || classId == null) {
            return null;
        }
        return classCourseDao.findByCourseIdAndClassId(courseId, classId);
    }
    
    @Override
    public List<ClassCourse> findByTeacherId(String teacherId) {
        if (StringUtils.isEmpty(teacherId)) {
            return new ArrayList<>();
        }
        return classCourseDao.findByTeacherId(teacherId);
    }
    
    @Override
    public List<ClassCourse> findByTerm(String term) {
        if (StringUtils.isEmpty(term)) {
            return new ArrayList<>();
        }
        return classCourseDao.findByTerm(term);
    }
    
    @Override
    @Transactional
    public boolean addClassCourse(ClassCourse classCourse) {
        // 参数校验
        if (classCourse == null || StringUtils.isEmpty(classCourse.getCourseId()) || 
            classCourse.getClassId() == null || StringUtils.isEmpty(classCourse.getTeacherId())) {
            return false;
        }
        
        // 检查课程是否存在
        if (courseDao.getById(classCourse.getCourseId()) == null) {
            return false;
        }
        
        // 检查班级是否存在
        if (classDao.getById(classCourse.getClassId()) == null) {
            return false;
        }
        
        // 检查教师是否存在
        if (teacherDao.getById(classCourse.getTeacherId()) == null) {
            return false;
        }
        
        // 检查关联是否已存在
        if (classCourseDao.exists(classCourse.getCourseId(), classCourse.getClassId())) {
            return false;
        }
        
        // 设置默认值
        if (StringUtils.isEmpty(classCourse.getStatus())) {
            classCourse.setStatus("未开始");
        }
        
        return classCourseDao.insert(classCourse) > 0;
    }
    
    @Override
    @Transactional
    public boolean assignClassesToCourse(String courseId, List<Long> classIds, String teacherId, String term) {
        if (StringUtils.isEmpty(courseId) || classIds == null || classIds.isEmpty() || StringUtils.isEmpty(teacherId)) {
            return false;
        }
        
        // 检查课程是否存在
        if (courseDao.getById(courseId) == null) {
            return false;
        }
        
        // 检查教师是否存在
        if (teacherDao.getById(teacherId) == null) {
            return false;
        }
        
        // 创建班级课程关联对象列表
        List<ClassCourse> classCourseList = new ArrayList<>();
        
        for (Long classId : classIds) {
            // 检查班级是否存在
            if (classDao.getById(classId) == null) {
                continue;
            }
            
            // 检查关联是否已存在
            if (classCourseDao.exists(courseId, classId)) {
                continue;
            }
            
            ClassCourse classCourse = new ClassCourse();
            classCourse.setCourseId(courseId);
            classCourse.setClassId(classId);
            classCourse.setTeacherId(teacherId);
            classCourse.setStatus("未开始");
            classCourse.setTerm(term);
            
            classCourseList.add(classCourse);
        }
        
        if (classCourseList.isEmpty()) {
            return false;
        }
        
        return classCourseDao.batchInsert(classCourseList) > 0;
    }
    
    @Override
    @Transactional
    public boolean updateClassCourse(ClassCourse classCourse) {
        if (classCourse == null || StringUtils.isEmpty(classCourse.getCourseId()) || 
            classCourse.getClassId() == null) {
            return false;
        }
        
        // 检查关联是否存在
        if (!classCourseDao.exists(classCourse.getCourseId(), classCourse.getClassId())) {
            return false;
        }
        
        // 如果更新了教师ID，检查教师是否存在
        if (!StringUtils.isEmpty(classCourse.getTeacherId()) && 
            teacherDao.getById(classCourse.getTeacherId()) == null) {
            return false;
        }
        
        return classCourseDao.update(classCourse) > 0;
    }
    
    @Override
    @Transactional
    public boolean updateStatus(String courseId, Long classId, String status) {
        if (StringUtils.isEmpty(courseId) || classId == null || StringUtils.isEmpty(status)) {
            return false;
        }
        
        // 检查关联是否存在
        if (!classCourseDao.exists(courseId, classId)) {
            return false;
        }
        
        // 检查状态是否合法
        if (!status.equals("未开始") && !status.equals("进行中") && !status.equals("已结束")) {
            return false;
        }
        
        ClassCourse classCourse = new ClassCourse();
        classCourse.setCourseId(courseId);
        classCourse.setClassId(classId);
        classCourse.setStatus(status);
        
        return classCourseDao.update(classCourse) > 0;
    }
    
    @Override
    @Transactional
    public boolean deleteClassCourse(String courseId, Long classId) {
        if (StringUtils.isEmpty(courseId) || classId == null) {
            return false;
        }
        
        return classCourseDao.delete(courseId, classId) > 0;
    }
    
    @Override
    @Transactional
    public boolean deleteClassCourseByCourseId(String courseId) {
        if (StringUtils.isEmpty(courseId)) {
            return false;
        }
        
        return classCourseDao.deleteByCourseId(courseId) >= 0;
    }
    
    @Override
    @Transactional
    public boolean deleteClassCourseByClassId(Long classId) {
        if (classId == null) {
            return false;
        }
        
        return classCourseDao.deleteByClassId(classId) >= 0;
    }
    
    @Override
    public boolean exists(String courseId, Long classId) {
        if (StringUtils.isEmpty(courseId) || classId == null) {
            return false;
        }
        
        return classCourseDao.exists(courseId, classId);
    }
    
    @Override
    public List<Long> getClassIdsNotInCourse(String courseId) {
        if (StringUtils.isEmpty(courseId)) {
            return new ArrayList<>();
        }
        
        return classCourseDao.findClassIdsNotInCourse(courseId);
    }
    
    @Override
    public List<Long> getClassIdsByCourseId(String courseId) {
        if (StringUtils.isEmpty(courseId)) {
            return new ArrayList<>();
        }
        
        return classCourseDao.findClassIdsByCourseId(courseId);
    }
    
    @Override
    public List<ClassCourse> getCoursesByClassId(Long classId) {
        if (classId == null) {
            return new ArrayList<>();
        }
        return findByClassId(classId); // 复用已有的方法
    }
    
    @Override
    @Transactional
    public boolean assignCourseToClass(ClassCourse classCourse) {
        return addClassCourse(classCourse); // 复用已有的方法
    }
    
    @Override
    @Transactional
    public boolean removeCourseFromClass(Long classId, String courseId) {
        if (classId == null || courseId == null) {
            return false;
        }
        try {
            int result = classCourseDao.removeCourseFromClass(classId, courseId);
            return result > 0;
        } catch (Exception e) {
            return false;
        }
    }
}